4   '   ******************************************

6   '   ** (DFT05-2A) GENERATE/ANALYZE WAVEFORM **

8   '   ******************************************

10 GOSUB 900

12 Q = 32: PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q: K2 = 1 / PI

14 DIM C(2, Q), S(2, Q), KC(2, Q), KS(2, Q)

16 CLS : FOR J = 0 TO Q: FOR I = 1 TO 2: C(I, J) = 0: S(I, J) = 0: NEXT: NEXT

20 CLS :   ' *    MAIN MENU    *

22 PRINT : PRINT : PRINT "         MAIN MENU": PRINT

24 PRINT " 1 = ADDITION THEOREM": PRINT

31 PRINT " 2 = EXIT": PRINT : PRINT

32 PRINT SPC(10); "MAKE SELECTION";

34 A$ = INKEY$: IF A$ = "" THEN 34

36 A = VAL(A$): ON A GOSUB 300, 1000

38 GOTO 20

40 CLS : N = 1: M = 2: K5 = Q: K6 = -1: GOSUB 108

42 FOR J = 0 TO Q: C(2, J) = 0: S(2, J) = 0: NEXT

44 GOSUB 200:   ' - PERFORM DFT

46 GOSUB 140:   ' - PRINT OUT FINAL VALUES

48 PRINT : INPUT "C/R TO CONTINUE"; A$

50 RETURN

80 CLS : GOSUB 150:   ' PRINT HEADING

81 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT

82 N = 2: M = 1: K5 = 1: K6 = 1

84 GOSUB 200:   ' INVERSE TRANSFORM

86 GOSUB 140:   ' PRINT OUTPUT

88 PRINT : INPUT "C/R TO CONTINUE"; A$

90 RETURN

100   '  ******************************************

102   '  *         PROGRAM SUBROUTINES            *

104   '  ******************************************

106   '  *       PRINT COLUMN HEADINGS            *

108 PRINT : PRINT

110 PRINT "FREQ    F(COS)      F(SIN)      FREQ     F(COS)    F(SIN)"

112 PRINT

114 RETURN

137   ' ******************************

138   ' *       PRINT OUTPUT         *

139   ' ******************************

140 FOR Z = 0 TO Q / 2 - 1

142 PRINT USING "##_    "; Z;

144 PRINT USING "##.#####_    "; C(M, Z); S(M, Z);

145 PRINT USING "##_    "; Z + Q / 2;

146 PRINT USING "##.#####_    "; C(M, Z + Q / 2); S(M, Z + Q / 2)

147 NEXT Z

148 RETURN

150   ' ******************************

152   ' *    PRINT COLUMN HEADINGS   *

154 PRINT

156 PRINT "                       RECONSTRUCTION": PRINT

158 PRINT " T      f(REAL)     f(IMAG)     T       f(REAL)     f(IMAG)": PRINT

160 RETURN

200   ' *******************************

202   ' *     TRANSFORM/RECONSTRUCT   *

204   ' *******************************

206 FOR J = 0 TO Q - 1:   ' SOLVE EQNS FOR EACH FREQUENCY

208 FOR I = 0 TO Q - 1:   ' MULTIPLY AND SUM EACH POINT

210 C(M, J) = C(M, J) + C(N, I) * COS(J * I * K1) + K6 * S(N, I) * SIN(J * I * K1)

211 S(M, J) = S(M, J) - K6 * C(N, I) * SIN(J * I * K1) + S(N, I) * COS(J * I * K1)

212 NEXT I

214 C(M, J) = C(M, J) / K5: S(M, J) = S(M, J) / K5:   ' SCALE RESULTS

216 NEXT J

218 RETURN

220   ' *******************************

222   ' *        PLOT FUNCTIONS       *

224   ' *******************************

225 SFF = .5: SFT = 1

226 SCREEN 9, 1, 1: COLOR 9, 1: CLS : YF = -1: YT = -1

228 LINE (0, 5)-(0, 155): LINE (0, 160)-(0, 310)

230 LINE (0, 155)-(600, 155): LINE (0, 310)-(600, 310)

232 GOSUB 266

234 COLOR 15, 1

236 FOR N = 0 TO Q - 1

238 GOSUB 260

240 LINE (X, Y)-(X, Y): LINE (X, Z)-(X, Z)

242 NEXT N

244 LOCATE 4, 15: PRINT "FREQUENCY DOMAIN"

246 LOCATE 18, 15: PRINT "TIME DOMAIN"

248 LOCATE 24, 1

250 INPUT "C/R TO CONTINUE"; A$

252 SCREEN 0, 0, 0

254 RETURN

256   ' *******************************

260 Y = SQR(C(2, N) ^ 2 + S(2, N) ^ 2): Y = 155 - (YF * Y)

262 X = N * 600 / Q: Z = 310 - (YT * C(1, N))

264 RETURN

265   ' *******************************

266 YF = 150 / SFF: YT = 150 / SFT: LINE (0, 5)-(5, 5): LINE (0, 80)-(5, 80)

268 LINE (0, 160)-(5, 160): LINE (0, 235)-(5, 235)

270 LOCATE 1, 2: PRINT SFF: LOCATE 6, 2: PRINT SFF / 2

272 LOCATE 12, 2: PRINT SFT: LOCATE 17, 2: PRINT SFT / 2

274 RETURN

299     ' *******************************

300 CLS ' *      ADDITION THEOREM       *

302     ' *******************************

304 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0

306 FOR J = 1 TO 2: KC(J, I) = 0: KS(J, I) = 0: NEXT: NEXT

308   ' *** GENERATE ADDITION TEST FUNCTION ***

310 PRINT : PRINT SPC(13); "EXPONENTIAL RISING EDGE": PRINT

312 FOR I = O TO Q / 2 - 1: C(1, I) = 1 - EXP(-I / 5): NEXT

314 GOSUB 158

316 M = 1: GOSUB 140

318 PRINT : INPUT "C/R TO CONTINUE"; A$

320 GOSUB 40

322 GOSUB 220

324 FOR I = O TO Q - 1: KC(1, I) = C(1, I): KC(2, I) = C(2, I): KS(2, I) = S(2, I): NEXT

326 FOR I = 0 TO Q - 1: C(1, I) = 0: NEXT

328 PRINT : PRINT SPC(13); "EXPONENTIAL FALLING EDGE": PRINT

330 K4 = 1 - EXP(-Q / 10)

332 FOR I = Q / 2 TO Q - 1: C(1, I) = K4 * EXP(-(I - (Q / 2)) / 5): NEXT

334 GOSUB 158:   ' PRINT HEADING

336 M = 1: GOSUB 140:   ' INPUT DATA

338 PRINT : INPUT "C/R TO CONTINUE"; A$

340 GOSUB 40:   ' TRANSFORM DATA

341 GOSUB 220:   ' PLOT DATA

342 CLS : PRINT SPC(5); "SUM XFORMS OF RISING AND FALLING EXPONENTIAL FUNCTIONS"

343 FOR I = 0 TO Q - 1: C(2, I) = C(2, I) + KC(2, I): S(2, I) = S(2, I) + KS(2, I): NEXT

344 M = 2: PRINT : GOSUB 108:   ' PRINT HEADING

345 GOSUB 140:   ' PRINT SUM OF XFORMS

346 PRINT : INPUT "C/R TO CONTINUE"; A$

347 CLS : GOSUB 150:   ' PRINT HEADING

348 GOSUB 81:   ' INVERSE TRANSFORM W/O HEADING

349 GOSUB 220:   ' PLOT DATA

350   ' * SUM BOTH RISING AND FALLING TIME DOMAIN FUNCTIONS *

351 GOSUB 900

352 PRINT : PRINT SPC(10); "EXPONENTIAL RISING EDGE";

354 FOR I = O TO Q / 2 - 1: C(1, I) = 1 - EXP(-I / 5): NEXT

356 PRINT " + EXPONENTIAL FALLING EDGE": PRINT

358 K4 = 1 - EXP(-Q / 10)

360 FOR I = Q / 2 TO Q - 1: C(1, I) = K4 * EXP(-(I - (Q / 2)) / 5): NEXT

362 GOSUB 158:   ' PRINT HEADING

364 M = 1: GOSUB 140:   ' PRINT INPUT DATA

366 PRINT : INPUT "C/R TO CONTINUE"; A$

368 GOSUB 40:   ' TRANSFORM DATA

370 GOSUB 220:   ' PLOT DATA

372 RETURN

900 CLS : SCREEN 9, 1, 1: COLOR 15, 1:   ' TEST DESCRIPTION

902 FOR DACNT = 1 TO 10

904 READ A$: PRINT SPC(5); A$

906 NEXT

908 INPUT "C/R TO CONTINUE"; A$

910 SCREEN 0, 0, 0: RETURN

920 DATA "                          TEST 1"

922 DATA " "

924 DATA "In this illustration we generate a rising exponential function from"

926 DATA "the equation Y1 = 1-EXP(-x/T1) and find its transform.  Next"

928 DATA "we generate a time displaced falling exponential function from the"

930 DATA "equation Y2 = A1*EXP(-x/T1), and sum its transform with the"

932 DATA "transform of Y1.  We then take the inverse transform of this"

934 DATA "summation which yields the time domain equivalent of the sum"

936 DATA "of the two time domain functions."

938 DATA " "

940 DATA "                TEST 2"

942 DATA " "

944 DATA "In the following illustration we sum together the two time"

946 DATA "domain functions (i.e. the rising and the falling exponentials)"

948 DATA "and take the forward transform of this function.  The"

950 DATA "resulting frequency spectrum is, of course, the same"

952 DATA "as the spectrum obtained by summing the transform"

954 DATA "of the rising exponential with the transform of the"

956 DATA "falling exponential."

958 DATA " "

1000 STOP



